//beräknar längden på en C-sträng
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
int len_str( const char *ch)
{
int len = 0;
if(! ch)
return 0;
while(*ch++) // while(ch[len])
len++; // len++;
return len;
}
int length (const char * String) {
int Len = 0;
if ( ! String ) {
// ingen sträng givet
return 0;
}
while ( String[Len] != '\0' ) {
Len++;
}
return Len;
}
void main () {
dos_console();
char * s1 = "Detta är en sträng!";
char * s2 = "Fyra";
char s3[] = "Denna texten är ganska så lång men det gör ingenting";
PR(s1);
PR(length(s1));
PR(s2);
PR(len_str(s2));
PR(s3); PR(len_str(s3));
cout << endl;
// strlen
PR(strlen(s3)); //strlen färdig funktion
}
//demonstrerar buffrad output med cout
#include <iostream>
#include <unistd.h>
#include "iodos.h"
using namespace std;
int main () {
// ingen flush, kommer att fastna i buffer
cout << "Väntar...";
sleep (3);
// töm buffrar med 'flush'
cout << "Väntar..." << flush;
sleep (3);
// implicit ömning via 'endl'
cout << "Väntar..." << endl;
sleep (3);
}
//bättre version av dynamisk vektorklass
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
class Vector {
public:
// konstruktor och destruktor
Vector (unsigned int Size) { m_Data = new int [Size]; m_Size = Size; }
~Vector () { delete [] m_Data; }
// accessmetoder
void set (unsigned int Index, int Value) { m_Data[Index] = Value; }
int get (unsigned int Index) const { return m_Data[Index]; }
// storleken på vektorn
unsigned int size () const { return m_Size; }
private:
// pekare till datablock
int * m_Data;
// storlek på vektor
unsigned int m_Size;
};
void main () {
// skapa en dynamisk vektor med 10 element
Vector v( 10 );
// fyll den ena med data
for ( int Index = 0; Index < v.size(); Index++ )
v.set ( Index, Index * 10 );
for(int i=0; i<v.size(); i++)
PR(v.get(i));
}
//demonsterar hur C-strängar skapas,
pekararitmetik
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
void main () {
dos_console();
char Hello1[] = "Hello!";
char * Hello2 = "Hello again!";
char Hello3[5];
char *copy = Hello2;
*(Hello3 + 0) = 'H';
*(Hello3 + 1) = 'e';
*(Hello3 + 2) = 'j';
*(Hello3 + 3) = '!';
*(Hello3 + 4) = '\0';
char *Hello4 = "OKEJ DÅ";
for(int i = 0; copy[i];i++) //copy[i] verkar fungerar
cout << copy[i];
cout << endl << endl;
PR(Hello4); //med makrot
cout << Hello1 << ' ' << Hello2 << ' ' << Hello3 << endl;
}
//demonsterar hur C-strängar skapas, []-operatorn
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iostream>
void main () {
char Hello1[] = "Hello!"; //tomma hakparenteser - kompilatorn
char * Hello2 = "Hello again!"; //räknar själv ut längden. Pekare ger
char Hello3[5]; //samma sak
Hello3[0] = 'H';
Hello3[1] = 'e';
Hello3[2] = 'j';
Hello3[3] = '!';
Hello3[4] = '\0'; //viktigt med nolltecken i slutet
cout << Hello1 << ' ' << Hello2 << ' ' << Hello3 << endl;
}
//demonstrerar hur en fil öppnas och stängs i C
#include <iostream>
#include <stdio.h>
#include "iodos.h"
using namespace std;
void main () {
char c;
// läs tecken ända tills vi får ett EOF (end of file)
while ( (c = getchar ()) != EOF ) {
putchar ( c );
}
}
//en enkel dynamisk vektorklass
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
class Vector {
public:
// konstruktor och destruktor
Vector (unsigned int Size) { m_Data = new int [Size]; m_Size = Size; }
~Vector () { }
// accessmetoder
void set (unsigned int Index, int Value) { m_Data[Index] = Value; }
int get (unsigned int Index) const { return m_Data[Index]; }
// storleken på vektorn
unsigned int size () const { return m_Size; }
private:
// pekare till datablock
int * m_Data;
// storlek på vektor
unsigned int m_Size;
};
void main () {
// skapa en dynamisk vektor med 100 element
Vector V ( 100 );
// fyll den med data
for ( int Index = 0; Index < 100; Index++ ) {
V.set ( Index, Index * 10 );
}
for(int i=0; i<V.size();i++)
V.set(i,i*i);
for(i=0; i<V.size();i++)
cout << i << " " << V.get(i) << endl;
}
//kopierar en C-sträng med en funktion strncpy().
//Allokerar minne.
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iostream>
#include <string.h>
void main () {
dos_console();
char Hello1[50] = "Hej! Detta är en lååång sträng.";
char * Hello2;
// allokera minne
Hello2 = new char [ strlen ( "Detta" ) + 1 ];
// utför kopieringen
strncpy ( Hello2, Hello1, 5 );
Hello2[5] = '\0';
cout << "Hello1 = '" << Hello1 << "', " << endl
<< "Hello2 = '" << Hello2 << "'" << endl;
delete [] Hello2;
}
//implementation av klassen 'Color'
#include <iostream>
#include "iodos.h"
using namespace std;
// definiera klasser 'Color'
class Color {
public:
// konstruktor
Color (float Red = 0.0, float Blue = 0.0, float Green = 0.0);
Color (const Color & Original);
// accessera de enskilda komponenterna
float red () const { return m_Red; }
float green () const { return m_Green; }
float blue () const { return m_Blue; }
void setRed (float Red) { m_Red = Red; }
void setGreen (float Green) { m_Green = Green; }
void setBlue (float Blue) { m_Blue = Blue; }
private:
// de enskilda komponenterna
float m_Red;
float m_Green;
float m_Blue;
};
Color::Color (float Red, float Blue, float Green) {
m_Red = Red;
m_Green= Green;
m_Blue = Blue;
}
Color::Color (const Color & Original) {
m_Red = Original.red ();
m_Green= Original.green ();
m_Blue = Original.blue ();
}
void main () {
// skapa några färger
Color Red ( 1 );
Color Grey ( 0.6, 0.6, 0.6 );
Color White ( 1, 1, 1 );
}
//jämför
två C-strängar
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << " ";
void jamfor(char * s1, char * s2)
{
PR(s1); PR(s2);
if ( strcmp ( s1, s2 ) == 0 )
cout << " (lika) " << endl;
else
cout << " (olika) " << endl;
}
void main () {
dos_console();
char * s1 = "Hej!";
char * s2 = "Hello world";
char * s3 = "Hello world";
char * s4 = "Sven";
char * s5 = "Sven";
// jämförelse
jamfor(s1,s2);
jamfor(s2,s2);
jamfor(s4,s5);
jamfor(s1,s5);
jamfor(s3,s2);
jamfor(s1,s1);
jamfor(s5,s2);
}
//jämför två C-strängar
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
bool compare (const char * S1, const char * S2) {
int i1 = 0;
int i2 = 0;
// säkerhet
if(! S1 || ! S2) // någondera (eller båda) strängarna odefinierade
return false;
while(S1[i1] != '\0' && S2[i2] != '\0') {
// är tecknen ännu lika?
if ( S1[i1++] != S2[i2++] )// nej, så strängarna är olika
return false;
}
return true; // strängarna är lika
}
void main () {
dos_console();
char * S1 = "Hej!";
char * S2 = "Hello world, this is main() calling";
char * S3 = "Hello world, this is main() calling";
// jämförelse
if( compare (S1, S2) ) //om sant
cout << "S1 och S2 är lika" << endl;
else
cout << "S1 och S2 är olika" << endl;
if( compare ( S2, S3 ) )
cout << "S2 och S3 är lika" << endl;
else
cout << "S2 och S3 är olika" << endl;
}
//classen coordinate
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
class Coordinate {
public:
// konstruktorer
Coordinate (float X, float Y) { m_X = X; m_Y = Y; };
Coordinate (const Coordinate & Original) { m_X = Original.x (); m_Y = Original.y (); };
Coordinate () { m_X = 0; m_Y = 0; };
// accessera medlemmar
float x () const { return m_X; };
float y () const { return m_Y; };
void setX (float X) { m_X = X; };
void setY (float Y) { m_Y = Y; };
private:
// medlemmar
float m_X;
float m_Y;
};
// skriv ut en koordinat
void printCoordinate (Coordinate C) {
cout << "X = " << C.x () << ", Y= " << C.y () << endl;
}
void main () {
Coordinate C1 ( 1, 2);
Coordinate C2 ( C1 );
Coordinate C3 = C1;
// skriv ut de olika koordinaterna
printCoordinate ( C1 );
printCoordinate ( C2 );
printCoordinate ( C3 );
//eget med macro
Coordinate Cor(25,35);
PR(Cor.x()); PR(Cor.y());
}
//kopierar en C-sträng
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
void main () {
dos_console();
char Hello1[5] = "Hej!";
char Hello2[5];
// utför kopieringen teckenvis
for ( int Index = 0; Index < 5; Index++ )
Hello2[Index] = Hello1[Index];
PR(Hello2);
char s[] = "Kopiera på ett annat sätt";
char s2[100]; //reservera tillräckligt med minne
int i = strlen(s); //strlen beräknar längden utan nolltecken
for(int k=0; k< i+1; k++)
s2[k]=s[k] ;
PR(s); PR(s2);
}
//konkatenerar en C-sträng till en annan
#include <iostream>
#include "iodos.h"
#include <string.h>
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
void concat (char * Source, char * Destination) {
// beräkna slutet på destinationssträngen
unsigned int Start = strlen ( Destination );
// iterera över och kopiera alla tecken
for ( unsigned int Index = 0; Index <= strlen ( Source ); Index++ ) {
// kopiera ett tecken
Destination[Start + Index] = Source[Index];
}
}
void main () {
dos_console();
char Destination[100] = "En exempelsträng";
char Source [] = " och en annan";
PR(Source); PR(Destination);
// utför kopieringen
concat ( Source, Destination );
cout << "Efter konkatenering" << endl;
PR(Destination);
}
//jämför vissa tecken av två C-strängar
#include <iostream>
#include "iodos.h"
#include <stdlib.h>
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
void main () {
char * S1 = "Hello world";
char * S2;
// utför kopieringen
S2 = strdup ( S1 );
cout << "S1 = '" << S1 << "', " << endl
<< "S2 = '" << S2 << "'" << endl;
// frigör strängen med C:s funktion free()
free ( S2 );
}
//kopierar en C-sträng
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
void copy (char * Source, char * Destination) {
// iterera över och kopiera alla tecken
for (int i = 0; i <= strlen (Source); i++ ) {
// kopiera ett tecken
Destination[i] = Source[i];
}
//ALTERNATIVT
// while(*Source)
// * Destination++ = *Source++;
// *Destination = '\0'; //lägger till nolltecknet eller ett varv till
// Destination++ = *Source++;
}
void main () {
dos_console();
char char_fran[] = "Detta är ett copyprov ";
char char_till[100]; //var noga med att dett finns reserverat tillräckligt
//med minne - annars violation
// utför kopieringen
copy (char_fran, char_till);
PR(char_fran);
cout << " till ";
PR(char_till);
}
//skriver ut tal till en fil i binär
form
#include <fstream>
#include <stdlib.h>
#include "iodos.h"
using namespace std;
void main () {
// öppna filen
ofstream Out ( "Test.bin");
char c[30] = "Test av att skriva till fil";
// kunde filen öppnas?
if ( ! Out ) {
// kunde inte öppna filen!
cout << "Kunde inte öppna filen 'Test.bin'!" << endl;
exit ( EXIT_FAILURE );
}
// skriv ut 10 tal till filen
for ( int Index = 0; Index < 10; Index++ ) {
// skriv ut talet binärt
Out.write ( c , sizeof(int) );
}
}
//söker i en sträng
#include <iostream>
#include "iodos.h"
#include <stdlib.h>
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
int findChar (char * String, char find) {
int i= 0;
// iterera tills vi kommer till slutet
while ( String[i] != '\0' ) {
// är det korrekt tecken?
if ( String[i] == find ) {
// vi har korrekt index
return i;
}
i++;
}
// inget index hittades
return -1;
}
void main () {
dos_console();
int Index;
char * s = "En sträng ur vilken vi söker text";
cout << "Söksträngen är: '" << s << "'" << endl;
// sök ett 'v'
if ( ( Index = findChar (s, 'v' )) != -1 ) {
cout << "Hittade ett 'v' på index " << Index << endl;
}
else {
cout << "Hittade inget 'v'" << endl;
}
// sök ett 'P'
if ( ( Index = findChar (s, 'P' )) != -1 ) {
cout << "Hittade ett 'P' på index " << Index << endl;
}
else {
cout << "Hittade inget 'P'" << endl;
}
}
//söker ett tecken ur en sträng med index()
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << " ";
//tveksamt om detta är rätt - index funktionen saknas
char * index(char *c, char find)
{
char *found;
found = c;
for(int i =0; i <= strlen(c); i++)
{
*found++;
if(c[i] == find)
return found;
}
return '\0';
}
void main () {
dos_console();
char * Found;
char * S = "En sträng ur vilken vi söker text";
cout << "Söksträngen är: '" << S << "'" << endl;
// sök ett 'v'
if ( ( Found = index (S, 'v' )) != 0 ) {
cout << "Hittade ett 'v' på index " << Found - S << endl;
}
else {
cout << "Hittade inget 'v'" << endl;
}
// sök ett 'x'
if ( ( Found = index (S, 'x' )) != 0 ) {
cout << "Hittade ett 'x' på index " << Found - S << endl;
}
else {
cout << "Hittade inget 'v'" << endl;
}
// sök ett 'P'
if ( ( Found = index (S, 'P' )) != 0 ) {
cout << "Hittade ett 'P' på index " << Found - S << endl;
}
else {
cout << "Hittade inget 'P'" << endl;
}
}
//testar makron med hjälp av preprocessorn
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#define KVADRAT(X) cout <<"Kvadraten på "<<X<<"*"<<X<<" = "<<((X)*(X))<< endl;
#define MAX(X,Y) cout<<X<<" och "<<Y <<" = " <<(X > Y ? X : Y)<< " är större" << endl;
#undef FOO
#ifdef FOO
#error "1"
#else
#endif
void main () {
dos_console();
int a=23, b = 56;
KVADRAT(a);
MAX(a,b);
}
//visar en enkel klass samt hur data
definieras som privat
#include <iostream>
#include "iodos.h"
using namespace std;
class Coordinate {
public:
// konstruktorer
Coordinate (float X, float Y) { m_X = X; m_Y = Y; };
Coordinate (int X, int Y) { m_X = X; m_Y = Y; };
Coordinate () { m_X = 0; m_Y = 0; };
// accessera medlemmar
float x () { return m_X; };
float y () { return m_Y; };
void setX (float X) { m_X = X; };
void setY (float Y) { m_Y = Y; };
private:
// medlemmar
float m_X;
float m_Y;
};
void main () {
Coordinate C = Coordinate ( 1, 2);
cout << C.x () << " "<< C.y () << endl;
C.setX (100);
C.setY (200);
cout << C.x () << " "<< C.y () << endl;
}
//öppna fil
för läsning
#include <iostream>
#include "iodos.h"
using namespace std;
if ( (Source = fopen (argv[1], "r" )) == 0 ) {
// kunde inte öppna filen
printf ("Kunde inte öppna filen '%s'\n", argv[1] );
exit (EXIT_FAILURE);
}
// öppna fil för skrivning
if ( (Destination = fopen (argv[2], "w" )) == 0 ) {
// kunde inte öppna filen
printf ("Kunde inte öppna filen '%s'\n", argv[2] );
exit (EXIT_FAILURE);
}
// läs tecken ända tills vi får ett EOF (end of file)
while ( (c = fgetc ( Source )) != EOF ) {
fputc ( c, Destination );
}
// stäng alla filer
fclose ( Source );
fclose ( Destination );
}
//en enkel dynamisk vektorklass
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
class Vector {
public:
// konstruktor och destruktor
Vector (unsigned int Size) { m_Data = new int [Size]; m_Size = Size; }
Vector (const Vector & Original) {
// allokera minne
m_Size = Original.size ();
m_Data = new int [ m_Size ];
// kopiera minnet
memcpy ( m_Data, Original.m_Data, sizeof(int) * m_Size );
}
~Vector () { delete [] m_Data; }
// accessmetoder
void set (unsigned int Index, int Value) { m_Data[Index] = Value; }
int get (unsigned int Index) const { return m_Data[Index]; }
// storleken på vektorn
unsigned int size () const { return m_Size; }
private:
// pekare till datablock
int * m_Data;
// storlek på vektor
unsigned int m_Size;
};
void main () {
// skapa en dynamisk vektor med 10 element
Vector v (10);
int a=1;
for(int i=0; i<v.size();i++)
{
v.set(i,a*a);
a++;
}
// skapa en kopia
Vector Destination(v);
for(i=0;i<v.size();i++)
PR(Destination.get(i));
}
//program som anropar en
funktion rekursivt och beräknar n! (n-fakultet)
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
unsigned int Fakultet (unsigned int n) {
if ( n == 0 ) {
// basfallet nått
return 1;
}
PR(n);
return n * Fakultet (n- 1);
}
void main () {
unsigned int Tal;
cout << "Ge in ett tal: ";
cin >> Tal;
// beräkna fakulteten och skriv ut svaret
cout << Tal << "! = " << Fakultet (Tal) << endl;
}
//program som anropar
en funktion rekursivt och beräknar ett
//Fibonacci-värde
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
unsigned int fib (unsigned int n) {
if ( n == 0 ) {
// basfall 1 nått
return 0;
}
if ( n == 1 ) {
// basfall 2 nått
return 1;
}
// allmänt fall, använd rekursion
return fib(n - 1) + fib(n - 2);
}
void main () {
unsigned int Tal;
cout << "Ge in ett tal: ";
cin >> Tal;
// beräkna fakulteten och skriv ut svaret
cout << "fib(" << Tal << ") = " << fib ( Tal ) << endl;
}
//funktion som dubblerar ett tal
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iomanip>
//! visar hur funktioner kan användas som parametrar
int dubblera(int Tal) {
return Tal + Tal;
}
// funktion som kvadrerar att tal
int kvadrera(int Tal) {
return Tal * Tal;
}
// funktion som applicerar en given funktion på en serie med tal
void applicera (int (*funktion)(int) ) {
// iterera över talen 0 till 4
for (int i = 0; i <= 4; i++ ) {
// applicera den givna funktionen på talet
cout << "Tal: " << setw(3) << i << " blir: "
<< setw(4) << funktion(i) << endl;
}
}
void main () {
cout << "Funktion: dubblera" << endl;
// anropa applicera() med funktionen dubblera()
applicera(dubblera);
cout << endl << "Funktion: kvadrera" << endl;
// anropa applicera() med funktionen kvadrera()
applicera (kvadrera);
}
//läser en given fil rad för rad och
räknar antalet rader
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <fstream>
#include <stdlib.h>
void main (int argc, char * argv[]) {
dos_console();
int Antal = 0;
char Buffer [250];
char Newline;
// har vi tillräckligt parametrar?
if ( argc != 2 ) {
cout << "Fel antal parametrar!" << endl;
cout << "Användning: " << argv[0] << " filnamn" << endl;
exit ( EXIT_FAILURE );
}
// öppna en fil
ifstream Data ( argv[1] );
if ( ! Data ) {
// kunde inte öppna filen
cout << "Kunde inte öppna filen: " << argv[1] << endl;
exit ( EXIT_FAILURE );
}
// läs rad för rad
while ( Data.get ( Buffer, 250 ) ) {
// läs det '\n' som finns
Data.get (Newline);
// öka antalet lästa rader
Antal++;
}
// skriv ett svar
cout << "Läste " << Antal << " rader." << endl;
}
//läser in ett tecken från
tangentbordet
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iomanip>
void main () {
char Tecken;
// upprepa slingan ända tills användaren ger in tecknet 'q'
do {
// läs in ett tecken
cout << "Ge ett tecken: ";
cin >> Tecken;
//cin.get(Tecken); tar med blank tecken
// cin >> noskipws >> Tecken;
cout << "Du gav in tecknet '" << Tecken << "'." << endl;
}
while ( Tecken != 'q' );
}
//läser in ett heltal, ett flyttal
och en sträng från tangentbordet
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
void main () {
int Tal;
float Flyttal;
string Text;
// läs ett tal
cout << "Ge ett heltal: " << flush;
cin >> Tal;
// läs ett decimaltal
cout << "Ge ett decimaltal: " << flush;
cin >> Flyttal >> Flyttal;
// läs en sträng
cout << "Ge en sträng: " << flush;
cin >> Text;
cout << "Du gav värdena '"
<< Tal << "', '"
<< Flyttal << "', '"
<< Text << "'." << endl;
}
//läser ett heltal och
hanterar felsituationer
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
void main () {
int Tal;
string Dummy;
// iterera evigt
while ( true ) {
// läs ett tal
cout << "Ge ett heltal: " << flush;
// läs ett tal
if ( ! (cin >> Tal) ) {
// illegalt tal
cout << "Illegalt heltal!" << endl;
// nollställ felindikatorn för cin
cin.clear ();
// läs bort resten av raden och ignorera denna
getline ( cin, Dummy );
}
else {
// talet är ok
cout << Tal << " är ett ok heltal!" << endl;
}
}
}
//Hello World med hjälp av namespaces
#include <iostream>
void main () {
int Ar;
// läs in ett år
//std::cout std måste skrivas ut namespace
std::cout << "Skriv ett år: ";
std::cin >> Ar;
// skriv vår hälsning
std::cout << "Hello world, detta är år " << Ar << std::endl;
}
//visar hur ett program som använder namespaces med flera kalsser i
#include "iodos.h"
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
#include <vector>
// definiera ett nytt namespace
namespace math {
// en matematisk vektor
class vector {
public:
vector () {};
};
// en matematisk matris
class matrix {
public:
matrix (int X, int Y) : m_X(X), m_Y(Y) {};
private:
int m_X, m_Y;
};
}
void main () {
// skapa en vektor av vektorer
std::vector<math::vector> VektorContainer;
// skapa en matrix
math::matrix M ( 3, 3 );
}
//class product
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
#include <iostream>
#include <string>
class Product {
public:
// konstruktor
Product (const string & Name, int Id) { m_Name = Name, m_Id = Id; }
~Product(){}
// skriv ut produkten på skärmen
void print () const;
private:
string m_Name;
int m_Id;
};
void Product::print () const {
cout << "Produktnamn: " << m_Name << ", id: " << m_Id << endl;
}
void main () {
Product * Lager [10]; //pekare av Product
int Id = 0;
string Names [10] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
// skapa nya produkter
for ( int Index = 0; Index < 10; Index++ ) {
Lager[Index] = new Product ( Names[Index], Id++ );
}
// skriv ut vårt lager
for (Index = 0; Index < 10; Index++ ) {
Lager[Index]->print ();
}
}
//class product2
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iostream>
#include <string>
class Product {
public:
// konstruktor
Product (const string & Name);
// skriv ut produkten på skärmen
void print () const;
private:
// en statisk variabel
static int m_NextId;
// normala medlemmar
string m_Name;
int m_Id;
};
Product::Product (const string & Name) {
m_Name = Name;
m_Id = m_NextId++;
}
// initialisera vår statiska variabel
int Product::m_NextId = 0;
void Product::print () const {
cout << "Produktnamn: " << m_Name << ", id: " << m_Id << endl;
}
void main () {
Product * Lager [10];
string Names [10] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
// skapa nya produkter
for ( int Index = 0; Index < 10; Index++ ) {
Lager[Index] = new Product ( Names[Index] );
}
// skriv ut vårt lager
for (Index = 0; Index < 10; Index++ ) {
Lager[Index]->print ();
}
}
//class product3
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iostream>
void main () {
dos_console();
int Tal = 256 ;
cout << "Rotering 1 varv åt höger = dividera med 2" << endl;
//division med 2
PR(Tal);
PR((Tal >> 1));
PR((Tal >> 2));
PR((Tal >> 3));
PR((Tal >> 4));
PR((Tal >> 5));
PR((Tal >> 6));
PR((Tal >> 7));
PR((Tal >> 8));
cout << endl << "Rotering 1 varv åt vänster = multiplicera med 2" << endl;
//multiplikation med 2
Tal = 1;
PR(Tal);
PR((Tal << 1));
PR((Tal << 2));
PR((Tal << 3));
PR((Tal << 4));
PR((Tal << 5));
PR((Tal << 6));
PR((Tal << 7));
PR((Tal << 8));
}
//kontrollerar om en given sträng
kan vara ett giltigt soccialskyddssignum
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iostream>
#include <string>
#include <ctype.h>
#include <stdlib.h>
bool okSignum (const string & Data) {
// är längde ok?
if ( Data.length () != 11 )
// kan inte vara ett signum
return false;
// först skall vi ha 6 siffror
for ( int Index = 0; Index < 6; Index++ ) {
if ( ! isdigit ( Data[Index] ) ) {
// ingen siffra
return false;
}
}
// nästa skall vara ett '-'
if ( Data[6] != '-' )
// inget '-'
return false;
// sedan 4 alfanumeriska tecken
for (Index = 7; Index < 11; Index++ ) {
if ( ! isalnum ( Data[Index] ) ) {
// ingen siffra
return false;
}
}
// det kan vara ett signum
return true;
}
int main (int argc, char * argv[]) {
// verifiera antal parametrar
if ( argc != 2 ) {
cout << "Fel antal parametrar!" << endl;
cout << "Användning: " << argv[0] << " signum" << endl;
return EXIT_FAILURE;
}
string Signum = argv[1];
// kolla ifall det är ett signum
if ( okSignum ( Signum ) ) {
cout << Signum << " kan vara ett giltigt socialskyddssignum." << endl;
}
else {
cout << Signum << " är inte ett giltigt socialskyddssignum." << endl;
}
}
//använder en iterator
för att skriva ut tecknen i en sträng
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <iostream>
#include <string>
void reverse();
void main () {
dos_console();
string S = "Hello";
// iterator till strängens tecken
string::iterator It = S.begin ();
// skriv ut alla tecken genom att iterera över dem
for ( ; It != S.end (); It++ ) {
cout << *It << endl;
}
reverse();
//olika utskriftsmöjligheter
string Original = "Hello world This is Levi calling";
string S1 = Original;
string S2 (10, 'A'); //skriver 10 A
string S3 (Original, 6, 5); //skriver 5 tecken med början från 6
string S4 (Original.begin (), Original.end ());
cout << S1 << endl;
cout << S2 << endl;
cout << S3 << endl;
cout << S4 << endl;
//! testar access till tecken i strängar m.h.a. []
// ändra 'w' till 'W'
S1 [6] = 'W'; //ändrar från liten till stor bokstav
S1 [23] = S1[6];
PR(S1);
// ändra 'W' till 'w' med .at
S1.at (23) = 'w';
PR(S1);
// ändra 'w' till 'W'
try {
S1.at (100) = 'W';
}
catch (...) {
cout << "Error" << endl; //exception
}
}
void reverse(){
string S = "Detta är en text";
// iterator till strängens tecken
string::reverse_iterator It = S.rbegin ();
// skriv ut alla tecken genom att iterera över dem
for ( ; It != S.rend (); It++ )
cout << *It ;
cout << endl;
}
//testar jämförelse av strängar
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
//! testar addering av strängar med operatorn +
string konkatenera(const string &, const string &);
//! testar konkatenering av strängar med +=
string konkatenera2(const string &, const string & );
void main () {
dos_console();
string S1 = "abc";
string S2 = "ABC";
string S3 = "Hej";
if ( S1 < S1 )
cout << S1 << " är mindre än " << S2 << endl;
else
cout << S1 << " är större än " << S2 << endl;
if ( S2 < S3 )
cout << S2 << " är mindre än " << S3 << endl;
else
cout << S2 << " är större än " << S3 << endl;
cout << "NYTT EXEMPEL" << endl << endl;
string Namn = konkatenera( "Sven Erik ", "Persson" );
string Text = "Fullständigt namn: " + Namn;
PR(Text);
cout << "EXEMPEL 2" << endl << endl;
Namn = konkatenera2("Per", "Adamsson");
PR(Namn);
}
//testar addering av
strängar med operatorn +
string konkatenera(const string & Fornamn, const string & Efternamn) {
// ge tillbaka det fullständiga namnet
return Fornamn + " " + Efternamn;
}
//testar konkatenering av
strängar med +=
string konkatenera2(const string & Fornamn, const string & Efternamn) {
string Namn = Fornamn;
Namn += ' ';
Namn += Efternamn;
// ge tillbaka det fullständiga namnet
return Namn;
}
//testar radering av text i en sträng
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
void main () {
string Text = "The Lord of the Rings";
Text.erase ( 0, 4 ); //tar bort 4 tecken med början från 0
cout << Text << endl;
Text = "The Lord of the Rings";
string S = "ABCL";
string::size_type i1 = Text.find_first_of ( 'e' ); // I1 == 2
string::size_type I2 = Text.find_first_of ( " or" ); // I2 == 3
string::size_type I3 = Text.find_first_of ( S ); // I3 == 4
PR(i1); PR(I2); PR(I3);
}
//testar sökning av tecken i en
sträng
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
void main () {
string Text = "The Lord of the Rings";
string S = "ABCL";
cout << Text.find_first_not_of ( "The" ) << endl;
cout << Text.find_first_not_of ( "the" ) << endl;
cout << Text.find_last_not_of ( "Rings" ) << endl;
cout << Text.find_last_not_of ( "abc" ) << endl;
string::size_type I1 = Text.find_first_not_of ( "The" ); // I1 == 3
string::size_type I2 = Text.find_first_not_of ( "the" ); // I2 == 0
string::size_type I3 = Text.find_last_not_of ( "Rings" ); // I3 == 15
string::size_type I4 = Text.find_last_not_of ( "abc" ); // I4 == 20
}
//testar sökning av substrängar
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
void main () {
string Text = "The Lord of the Rings";
if ( Text.find ( "lord" ) != string::npos )
cout << "Hittade" << endl;
else
cout << "Hittade ej" << endl;
}
//visar hur strängars
längd kan fås med length() och size()
#include <iostream>
#include "iodos.h"
using namespace std;
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
void main () {
string S1 = "Hello world";
string S2;
// skriv ut strängens längd
cout << "size() : " << S1.size () << endl;
cout << "length() : " << S1.length () << endl;
//! testar ersättning av text i en sträng
string Text = "The Lord of the Rings";
Text.replace ( Text.find ( "Lord"), 4, "lord" );
cout << Text << endl;
}
//struct product
#include <iostream>
#include "iodos.h"
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
using namespace std;
struct Produkt {
string Namn;
float Pris;
int Antal;
};
void nyProdukt (Produkt & P) {
// läs in data i produktens medlemmar
cout << "Namn : ";
cin >> P.Namn;
cout << "Pris : ";
cin >> P.Pris;
cout << "Antal: ";
cin >> P.Antal;
}
void skrivUt (Produkt * P) {
// skriv ut info om produkten
cout << endl;
cout << "Information om produkt: " << endl;
cout << " namn: " << P->Namn << endl;
cout << " pris: " << (*P).Pris << endl; //samma som P->Pris
cout << " antal: " << P->Antal << endl;
}
void main () {
dos_console();
Produkt Ny;
// läs in en produkt
nyProdukt ( Ny );
// skriv ut på skärmen
skrivUt ( &Ny );
}
//testar substrängar av en sträng
#include <iostream>
#include "iodos.h"
#define PR(EXP) cout << #EXP << " = " << EXP << endl;
#include <string>
using namespace std;
void main () {
string Text = "The Lord of the Rings";
string Sub1 = Text.substr ( 16 );
string Sub2 = Text.substr ( 9, 2 );
PR(Sub1); PR(Sub2);
}